#ifndef __WIZ_UTILS_UTF_HPP__SHANHAOBO_19800429__
#define __WIZ_UTILS_UTF_HPP__SHANHAOBO_19800429__

#include "../Base/WizBase.hpp"

namespace Wiz
{
    namespace UTF8
    {
        WIZ_INLINE ::Wiz::Size::Type CalcLen(::Wiz::UInt16::In UCS2)
        {
            return UCS2 < 0x0080 ? 1 : UCS2 < 0x0800 ? 2 : 3;
        }
        WIZ_INLINE ::Wiz::Size::Type Len(::Wiz::UInt8::InPtr UTF8Ptr)
        {
            return UTF8Ptr[0] < 0xC0 ? 1 : UTF8Ptr[0] < 0xE0 ? 2 : 3;
        }
        ::Wiz::Size::Type FromUCS2(::Wiz::UInt8::OutPtr Result, ::Wiz::UInt16::In UCS2);
        ::Wiz::Size::Type ToUCS2(::Wiz::UInt16::Out Result, ::Wiz::UInt8::InPtr UTF8Ptr);
        ::Wiz::Size::Type FromUCS4(::Wiz::UInt8::OutPtr Result, ::Wiz::UInt32::In UCS4);
        ::Wiz::Size::Type ToUCS4(::Wiz::UInt32::Out Result, ::Wiz::UInt8::InPtr UTF8Ptr);

        template<typename T>
        ::Wiz::Size::Type From(::Wiz::UInt8::OutPtr Result, const T& );
        template<>
        WIZ_INLINE ::Wiz::Size::Type From<::Wiz::UInt16::Type>(::Wiz::UInt8::OutPtr Result, ::Wiz::UInt16::In UCS2)
        {
            return FromUCS2(Result, UCS2);
        }
        template<>
        WIZ_INLINE ::Wiz::Size::Type From<::Wiz::UInt32::Type>(::Wiz::UInt8::OutPtr Result, ::Wiz::UInt32::In UCS4)
        {
            return FromUCS4(Result, UCS4);
        }
    } /// end of namespace UTF8
} /// end of namespace Wiz

#endif /*__WIZ_UTILS_UTF_HPP__SHANHAOBO_19800429__*/
